package picutils

import (
	"bytes"
	"fmt"
	"github.com/PuerkitoBio/goquery"
	"io/ioutil"
	"log"
	"net/http"
	"os"
	"os/exec"
	"path"
	"path/filepath"
	"regexp"
	"strconv"
	"strings"
)

//从字符中提取数字 匹配不到数字返回 true
func GetInt(text string) (int, bool) {
	//正则表达式 \D 匹配非数字
	compile := regexp.MustCompile(`\D*(\d+)\D*`)
	//	查找所有的 //3	使用正则表达式的提取功能|
	match := compile.FindAllStringSubmatch(text, 1) // 返回的是 [][]string
	pageCount, err := strconv.Atoi(match[0][1])
	if err != nil {
		fmt.Println("图片数量匹配错误")
		return 0, true
	}
	return pageCount, false
}

//把url 转换成 goquery.Document
func HttpGetByUrl(url string) (*goquery.Document, error) {
	resp, err := http.Get(url)
	if err != nil {
		fmt.Println("解析album失败")
		return nil, nil
	}
	doc, err := goquery.NewDocumentFromReader(resp.Body)
	return doc, err
}

//执行cmd https://www.bbsmax.com/A/6pdDybjqzw/ go exec中，命令的所有参数都需要分开填写才行。
func ExecuteCmd(cmdShell string, arg ...string) bool {

	var outInfo bytes.Buffer
	cmd := exec.Command(cmdShell, arg...)
	// 设置接收
	cmd.Stdout = &outInfo
	// 执行|Start 不等待结果，Run 等待结果
	err := cmd.Run()
	if err != nil {
		//TODO 暂时注释
		log.Println("下载失败 ", err, arg)
		_ = os.Remove(arg[len(arg)-1])
		return false
	} else {
		if GetFileSize(arg[len(arg)-1]) == 0 {
			_ = os.Remove(arg[len(arg)-1])
		}
		log.Println("downing ", arg[len(arg)-1])
		//log.Println("执行结束", outInfo.String(), arg)
	}
	return true

}

// 仅仅执行CMd
func ExecuteCmdOnly(cmdShell string, arg ...string) {

	var outInfo bytes.Buffer
	cmd := exec.Command(cmdShell, arg...)
	// 设置接收
	cmd.Stdout = &outInfo
	// 执行|Start 不等待结果，Run 等待结果
	err := cmd.Run()
	if err != nil {
		log.Println("失败 ", err, arg)
	} else {
		log.Println("执行结束", outInfo.String(), arg)
	}
}
func ExecuteCmdOther(cmdShell string, arg ...string) {
	cmd := exec.Command(cmdShell, arg...)
	var out bytes.Buffer
	var stderr bytes.Buffer
	cmd.Stdout = &out
	cmd.Stderr = &stderr
	// 执行|Start 不等待结果，Run 等待结果
	err := cmd.Run()
	if err != nil {
		fmt.Println(fmt.Sprint(err) + ": " + stderr.String())
		return
	}
	fmt.Println("Result: " + out.String())
}
func MkdirFileAll(parentPath, mkdirAname string) {
	picSaveFile := parentPath + "/" + mkdirAname
	_, err := os.Stat(picSaveFile)
	if err != nil {
		os.MkdirAll(picSaveFile, os.ModePerm)
	}
}
func PathDo(str string) string {
	if strings.HasSuffix(str, "/") {
		return str
	}
	return str + "/"
}

// 判断文件夹是否为空
func DirIsEmpty(dirName string) bool {
	dir, _ := ioutil.ReadDir(dirName)
	if len(dir) == 0 {
		return true
	}
	return false
}
func GetFileSize(filename string) int64 {
	var result int64
	filepath.Walk(filename, func(path string, f os.FileInfo, err error) error {
		result = f.Size()
		return nil
	})
	return result
}

//
//获取指定目录下的所有文件和目录
func GetFilesAndDirs(dirPth string) (files []string, dirs []string, err error) {
	dir, err := ioutil.ReadDir(dirPth)
	if err != nil {
		return nil, nil, err
	}
	PthSep := string(os.PathSeparator)
	//suffix = strings.ToUpper(suffix) //忽略后缀匹配的大小写
	for _, fi := range dir {
		if fi.IsDir() { // 目录, 递归遍历
			dirs = append(dirs, dirPth+PthSep+fi.Name())
			GetFilesAndDirs(dirPth + PthSep + fi.Name())
		} else {
			// 过滤指定格式
			ok := strings.HasSuffix(fi.Name(), ".go")
			if ok {
				files = append(files, dirPth+PthSep+fi.Name())
			}
		}
	}
	return files, dirs, nil
}

//获取指定目录下的所有文件,包含子目录下的文件
func GetAllFiles(dirPth string) (files []string, err error) {
	var dirs []string
	dir, err := ioutil.ReadDir(dirPth)
	if err != nil {
		return nil, err
	}
	PthSep := string(os.PathSeparator)
	for _, fi := range dir {
		if fi.IsDir() { // 目录, 递归遍历
			dirs = append(dirs, dirPth+PthSep+fi.Name())
			GetAllFiles(dirPth + PthSep + fi.Name())
		} else {
			// 过滤指定格式
			//ok := strings.HasSuffix(fi.Name(), ".go")
			files = append(files, dirPth+PthSep+fi.Name())
		}
	}
	// 读取子目录下文件
	for _, table := range dirs {
		temp, _ := GetAllFiles(table)
		for _, temp1 := range temp {
			files = append(files, temp1)
		}
	}
	return files, nil
}

//获取指定目录下的所有文件,不包含子目录下的文件
func GetAllFilesOnly(dirPth string) (files []string, err error) {
	dir, err := ioutil.ReadDir(dirPth)
	if err != nil {
		return nil, err
	}
	PthSep := string(os.PathSeparator)
	for _, fi := range dir {
		if fi.IsDir() { // 目录, 递归遍历
		} else {
			// 过滤指定格式
			//ok := strings.HasSuffix(fi.Name(), ".go")
			files = append(files, dirPth+PthSep+fi.Name())
		}
	}
	return files, nil
}

//GetAllFilesByExt 根据后缀获取
func GetAllFilesByExt(dirPth string, ext string) (files []string, err error) {
	var dirs []string
	dir, err := ioutil.ReadDir(dirPth)
	if err != nil {
		return nil, err
	}
	PthSep := string(os.PathSeparator)
	for _, fi := range dir {
		if fi.IsDir() { // 目录, 递归遍历
			dirs = append(dirs, dirPth+PthSep+fi.Name())
			GetAllFilesByExt(dirPth+PthSep+fi.Name(), ext)
		} else {
			// 过滤指定格式
			//ok := strings.HasSuffix(fi.Name(), ".go")
			//strings.Index(".mp4.m4v.TS")
			if strings.Index(ext, path.Ext(fi.Name())) >= 0 {
				files = append(files, dirPth+PthSep+fi.Name())
			}
		}
	}
	// 读取子目录下文件
	for _, table := range dirs {
		temp, _ := GetAllFilesByExt(table, ext)
		for _, temp1 := range temp {
			files = append(files, temp1)
		}
	}
	return files, nil
}
